 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=33 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Use a testing framework (JUnit)
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='debug,spec,specification,junit,test,java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Use a testing framework (JUnit)</div>

<div class='main-body'>
 
<br>Use a testing framework to ensure your class fulfills its <a href="TopicAction63b6-2.html">contract</a>.
<p>One widely used framework is <a href="http://www.junit.org/">JUnit</a>.
<p>JUnit has these advantages :
<ul>
<li>
it is simple to use</li>

<li>
it can test a single class at a time, or a suite of tests can be created
for a group of classes</li>

<li>
it <i>greatly</i> increases your confidence in the correctness of your code</li>

<li>
it often improves the design of the class you are testing - since you spend
more time thinking about <a href="TopicAction59d6-2.html">how an object is actually
<i>used</i></a>, instead of its implementation, defects in its interface
become more obvious</li>

<li>
failure of a test is glaringly obvious</li>

<li>
the positive feedback provided by successful tests produces unmistakably
warm, fuzzy feelings even in the embittered heart of an experienced programmer ;)</li>
</ul>


<h3>Test Doubles</h3>
Unit testing is about testing classes in isolation, one at a time. 
However, classes usually don't operate in isolation - they usually have <em>collaborators</em>, other classes needed for correct operation.
In some cases, those collaborators aren't immediately available during unit testing. 
For example, in a servlet application, the underlying request and response objects are created by the servlet container, and passed to the application for further processing.
During unit testing, the 'real' request and response are not typically available, since the servlet container isn't running.

<P>Thus, <a href='http://www.martinfowler.com/bliki/TestDouble.html'>test doubles</a> are often required during unit testing.
Test doubles are used to mimic the collaborators of a class being tested.
See <a href='http://xunitpatterns.com/Using%20Test%20Doubles.html'>xUnitPatterns.com</a> by Gerard Meszaros for more information.

<h3>Tests and Packages</h3>
Some programmers put their unit tests in a package separate from the classes being tested. 
This is neither necessary nor desirable. 
It's not necessary since the tests can always be placed in the same package as the items being tested. 
It's not desirable for two reasons:
<ul>
 <li>it's not compatible with <a href='TopicActionfc56-2.html?Id=205'>package-by-feature</a>
 <li>it often forces you to increase the scope of items being tested to <tt>public</tt>, merely for the sake of running unit tests
</ul>

<P>From <em>Effective Java</em>, by Johsua Bloch :
<P><em>"It is not acceptable to make a class, interface, or member a part of a package's exported API to facilitate testing.
Luckily, it isn't necessary either, as tests can be made to run as part of the package being tested, thus gaining access to its package-private elements."</em>


<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicAction59d6-2.html?Id=74'>Construct classes from the outside in</a> <br>
 
  
  <a href='TopicAction55f0-2.html?Id=135'>Use Ant for build scripts</a> <br>
 
  
  <a href='TopicAction0450-2.html?Id=174'>Test using main method</a> <br>
 
  
  <a href='TopicAction63b6-2.html?Id=194'>Design by Contract</a> <br>
 
  
  <a href='TopicAction3987-2.html?Id=198'>Choose form validation style carefully</a> <br>
 
  
  <a href='TopicActionec62-2.html?Id=234'>Use a fake system clock</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='33'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=33 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
